// 引入事务装饰器
import { Transaction, Transactioner } from '../src/decorator';
// 引入数据库连接池和事务管理器
import { pool, TransactionManager } from '../function/db/transactionmanager';

/**
 * 用户服务类，提供用户相关的数据库操作。
 * UserService 类提供了两个方法：addUser 和 getUserByName。
 * 使用了 Transaction 装饰器，确保数据库操作在事务的控制下进行。
 * testAddUser 函数用于测试 addUser 方法的功能，并验证事务是否正确工作。
 * 如果在 addUser 方法中的数据库操作过程中出现任何错误，事务将被回滚，并且错误被捕获并处理
 */

class UserService {
    /**
     * 使用事务控制添加一个新用户到数据库。
     * @param name 要添加的用户名
     * @returns 返回一个 Promise，无返回值。
     */
    @Transaction()
    async addUser(name: string): Promise<void> {
        // 准备 SQL 查询语句以插入新用户
        const query = 'INSERT INTO users (name) VALUES (?)';

        // 使用数据库连接池执行数据库插入操作
        await new Promise((resolve, reject) => {
            pool.query(query, [name], (error, results) => {
                if (error) {
                    reject(error); // 如有错误，则拒绝 Promise
                } else {
                    resolve(results); // 否则，解析 Promise
                }
            });
        });
        // 可以取消注释下面这行来模拟触发错误，以测试事务回滚
        // throw new Error("Simulated error");
    }
}

/**
 * 测试函数，用于测试添加用户的功能。
 */
async function testAddUser() {
    const userService = new UserService();

    try {
        // 尝试添加一个名为 'peter' 的用户
        // await userService.addUser('peter');
        let result = await userService.addUser("pee")
        console.log(result);

        console.log('success');
    } catch (error) {
        // 如果添加用户过程中发生错误，打印错误信息
        console.error('Failed to add user:', error.message);
    }
}

// 执行测试函数
testAddUser();

